package cn.iocoder.yudao.module.design.service.reform;

import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.design.controller.admin.reform.vo.ReformCreateReqVO;
import cn.iocoder.yudao.module.design.controller.admin.reform.vo.ReformUpdateReqVO;
import cn.iocoder.yudao.module.design.convert.reform.ReformConvert;
import cn.iocoder.yudao.module.design.dal.dataobject.reform.ReformDO;
import cn.iocoder.yudao.module.design.dal.mysql.reform.ReformMapper;
import cn.iocoder.yudao.module.design.service.flow.FlowService;
import cn.iocoder.yudao.module.design.service.house.HouseService;
import cn.iocoder.yudao.module.design.service.node.NodeService;
import cn.iocoder.yudao.module.design.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.design.enums.design.ReformStatusEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.design.enums.ErrorCodeConstants.*;

/**
 * 项目整改单 Service 实现类
 *
 * @author czw 
 */
@Service
@Validated
public class ReformBusinessServiceImpl implements ReformBusinessService {

    @Resource
    private ReformMapper reformMapper;

    @Resource
    private HouseService houseService;

    @Resource
    private FlowService flowService;

    @Resource
    private NodeService nodeService;

    @Resource
    private ReformService reformService;

    @Override
    public Integer createReform(ReformCreateReqVO createReqVO) {
       /* 前端传入字段【项目id, 流程id, 节点id, 类型, 名称, 说明, 价格, 数量  , 总价  ,  确认人, 】
        默认状态0待确认、默认创建人为当前登陆人；校验项目id 是否存在   存在则保存到hd_reform 表中 不存在则报错。*/
        houseService.validateHouseExists(createReqVO.getHouseId());
        if(createReqVO.getFlowId() != null){
            flowService.validateFlowExists(createReqVO.getFlowId());
        }
        // 校验nodeId 是否存在
        if(createReqVO.getNodeId()!= null){
            nodeService.validateNodeExists(createReqVO.getNodeId());
        }

        // 插入
        ReformDO reform = ReformConvert.INSTANCE.convert(createReqVO);

        BigDecimal totalPrice = new BigDecimal(reform.getNum()*reform.getPrice());
        // 四舍五入
        totalPrice = totalPrice.setScale(2, RoundingMode.HALF_UP);
        reform.setTotalPrice(totalPrice);
        reform.setDeleted(false);
        reform.setStatusCd(ReformStatusEnum.REFORM_STATUS_ENUM_0.getCode().toString());
        reform.setCreator(SecurityFrameworkUtils.getLoginUserId().toString());
        reformMapper.insert(reform);
        // 返回
        return reform.getId();
    }

    /**
     * 更新项目整改单状态
     *
     * @param id     Long类型的项目整改单ID
     * @param status Integer类型的项目整改单状态
     * @param confirmUrl String签字确认
     */
    @Override
    public void updateReformStatus(Integer id, String status,String confirmUrl) {

        /*传入【整改单id  、状态、签字确认】字段 判断当前登陆人 是否为该整改单的创建人、确认人，是则修改 不是则报错**/

        //根据整改单id查询整改单的创建人、确认人
        ReformDO reformDO = reformService.getReform(id);
        //查不到就报错
        if (reformDO == null){
            throw exception(REFORM_NOT_EXISTS);
        }
        //查到断当前登陆人 是否为该整改单的创建人或确认人
        //获取当前登陆人
        LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
        if (loginUser.getId().equals(reformDO.getConfirmUser())||loginUser.getId().equals(reformDO.getCreator())){
            //更改整改单状态
            reformDO.setStatusCd(status);
            reformDO.setConfirmUrl(confirmUrl);
            reformMapper.updateById(reformDO);
        }else {
            throw exception(REFORM_BUSINESS_NOT_EXISTS);
        }
    }

    /**
     * 更新项目整改单
     *
     * @param updateReqVO 更新信息
     */
    @Override
    public void updateReform(ReformUpdateReqVO updateReqVO) {
        //获取当前登陆人
        LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
        //根据整改单id查询整改单
        ReformDO reformDO = reformService.getReform(updateReqVO.getId());

        //判断当前登陆人 是否为该整改单的创建人、且状态为2-已驳回  否则报错 当前状态不允许修改
        if(loginUser.getId().equals(reformDO.getCreator())&&reformDO.getStatusCd().equals(ReformStatusEnum.REFORM_STATUS_ENUM_2.getCode().toString())){
            // 简化代码  工具转换
            ReformDO reform = ReformConvert.INSTANCE.convert(updateReqVO);

            BigDecimal totalPrice = new BigDecimal(reform.getNum()*reform.getPrice());
            // 四舍五入
            totalPrice = totalPrice.setScale(2, RoundingMode.HALF_UP);
            reform.setTotalPrice(totalPrice);

            //更新项目整改单
            reformMapper.updateById(reform);
        }else {
            throw exception(REFORM_BUSINESS_STATUS_NOT_EXISTS);
        }

    }

    /**
     * 项目整改单确认
     *
     * @param id  Long类型的项目整改单ID
     * @param statusCd Integer类型的项目整改单状态
     * @param  confirmUrl 签字确认
     */
    @Override
    public void confirmReform(Integer id,String statusCd, String confirmUrl) {
        ReformDO reformDO = reformService.getReform(id);


        //查不到就报错
        if (reformDO == null){
            throw exception(REFORM_NOT_EXISTS);
        }else {
            if(!ReformStatusEnum.REFORM_STATUS_ENUM_0.getCode().toString().equals(reformDO.getStatusCd())){
                throw ServiceExceptionUtil.exception(ErrorCodeConstants.REFORM_NOT_CONFIRM_STATUS);
            }
            String loginUserId = SecurityFrameworkUtils.getLoginUser().getId().toString();
            if(!loginUserId.equals(reformDO.getConfirmUser().toString())){
                throw ServiceExceptionUtil.exception(ErrorCodeConstants.REFORM_NOT_CONFIRM_USER);
            }
            //不为空就更新
            reformDO.setConfirmUrl(confirmUrl);
            reformDO.setStatusCd(statusCd);
            reformMapper.updateById(reformDO);

            // 发送消息  确认消息 和拒绝消息
        }
    }

}
